<!DOCTYPE html>
<html lang="zn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>函数的方法</title>
    <script>
        function fun(a,b){
            console.log("a="+a);
            console.log("b="+b);
            alert(this);
        }

        var obj = {
            name:"obj",
            sayName:function(){
                alert(this.name);
            }
        };

        /*
            call()和apply()
                这两个方法都是函数对象的方法，需要通过函数对象来调用
                当对函数调用call()和apply()都会调用函数执行
                在调用call()和apply()可以将一个对象指定为第一个参数
                    此时这个对象将会成为函数执行时的this
                call()方法可以将实参在对象之后依次传递
                apply()方法需要将实参封装到一个数组中统一传递

                this的情况：
                    1.以函数形式调用时，this永远都是window
                    2.以方法的形式调用时，this是调用方法的对象
                    3.以构造函数的形式调用时，this是新创建的那个对象
                    4.使用call和apply调用时，this就是指定的那个对象
        */

        // fun.call(obj,2,3);
        // fun.apply(obj,[2,3]);

        var obj2 = {
            name:"obj2"
        };

        // fun.apply();
        // fun.call();
        // fun();

        // fun.call(obj);
        // fun.apply(obj);

        obj.sayName();
        obj.sayName.apply(obj2);
    </script>
</head>
<body>
    
</body>
</html>